基础概念
零、前言
本金记录一些最基础的Github Actions 知识,使用这些知识可以对Github Action有最初步的理解
什么是GitHub Actions ?
大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。
常用使用流程
创建一个github的ser
设置触发点
- 设置忽略文件
拉取仓库代码
一、基本概念
- workflow 文件
- 常用钩子
- cache
- matrix
二、基础语法
钩子的编写语法
on: push
on: [push]
命令换行
每个步骤也都有一个name: 表示该步骤的名称。run: 后面添加你自己要执行的命令,如果有多条命令,用| 换行。如果只有一行命令,可以直接写作run: 后面
- name: Update zhihu
run: |
cd zhihu
sh run.sh
指定 shell 类型(cmd or powershell)
使用 shell 关键字,来指定特定的 shell:
steps:
- name: Display the path
run: echo $PATH
shell: bash
运行命令
使用 run
关键字
# 单行命令
- name: Install Dependencies
run: npm install
# 多行命令
- name: Clean install dependencies and build
run: |
npm ci
npm run build
使用矩阵
是有时候,我们的代码可能编译环境有多个。
比如 electron 的程序,我们需要在 macos 上编译 dmg 压缩包,在 windows 上编译 exe 可执行文件。
这类情况就可以使用矩阵来解决
下面这段代码就会执行 6 次—— 2 x 3 = 6次
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-18.04]
node: [6, 8, 10]
steps:
- uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
修改工作目录
使用 working-directory 关键字,我们可以指定 command 的运行位置:
- name: Clean temp directory
run: rm -rf *
working-directory: ./temp
三、环境变量
相关资料:
使用方式:
# 方式1 ${{上下文对象.属性名}}
run: echo "🎉github.event_name -> ${{ github.event_name }}"
# 方式2:${{上下文对象['属性名']}}
run: echo "🎉github.event_name2 -> ${{ github['event_name'] }}"
# 方式3:$ENV_NAME ($下上文对象_属性名)
run: echo "🎉github.event_name3 -> $GITHUB_EVENT_NAME"
run: echo "🎉github.event_name3 -> " $GITHUB_EVENT_NAME
上下文名称 | 类型 | 描述 |
---|---|---|
github | 对象 | 工作流程运行的相关信息。 更多信息请参阅 github 上下文。 |
env | 对象 | 包含工作流程、作业或步骤中设置的环境变量。 更多信息请参阅 env 上下文。 |
job | 对象 | 有关当前运行的作业的信息。 更多信息请参阅 job 上下文。 |
steps | 对象 | 有关当前作业中已运行的步骤的信息。 更多信息请参阅 steps 上下文。 |
runner | 对象 | 运行当前作业的运行程序相关信息。 更多信息请参阅 runner 上下文。 |
secrets | 对象 | 包含可用于工作流程运行的机密的名称和值。 更多信息请参阅 secrets 上下文。 |
strategy | 对象 | 有关当前作业的矩阵执行策略的信息。 更多信息请参阅 strategy 上下文。 |
matrix | 对象 | 包含在工作流程中定义的应用于当前作业的矩阵属性。 更多信息请参阅 matrix 上下文。 |
needs | 对象 | 包含定义为当前作业依赖项的所有作业的输出。 更多信息请参阅 needs 上下文。 |
inputs | object | 包含可重用工作流的输入。 更多信息请参阅 inputs 上下文。 |
四、常用钩子
1、全局匹配
on: push
所有push
操作都会触发
2、指定分支
on:
push:
branches:
- 'main'
- 'master'
- 'release/**'
仅当在 main或者master分支收到推送时时才触发
3、指定文件
on:
push:
paths:
- '**.js'
4、指定tag
on:
push:
tags:
- v1.**
当有人推送以 v1.
开头的标记时,此工作流程将运行
5、指定分支同时指定文件
# 指定某分支
on:
push:
branches:
- 'release/**'
paths:
- '**.js'
仅当向名称以 releases/
开头的分支发生推送,且包含 JavaScript (.js
) 文件时才会运行工作流程
定时任务(注意时差)
Github Actions 的定时任务是根据 crontab guru语法 进行配置的,可以非常灵活的定制各种执行条件,不过需要注意的是定时任务只是表示github会在指定时间将我们的workflow加入它的执行队列,并不等于在指定时间马上执行。
on:
schedule:
- cron: '30 5 * * 1,3'
- cron: '30 5 * * 2,4'
jobs:
test_schedule:
runs-on: ubuntu-latest
steps:
- name: Not on Monday or Wednesday
if: github.event.schedule != '30 5 * * 1,3'
run: echo "This step will be skipped on Monday and Wednesday"
- name: Every time
run: echo "This step will always run"
上面脚本定义了两个setps,一个每次都会执行,一个仅在 schedule 符合条件时,当前设置了周一和周三才会执行
这里的定时任务指定的时间和我们中国的时区是有时差的。北京时间比Github所使用时区快8个小时。比如7月1号23点,github时间是7月1号15点。所以我们可以配置成15点或16点执行(对应北京时间的夜里11点、12点)。
计划任务语法有五个字段,中间用空格分隔,每个字段代表一个时间单位。
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
运算符 | 描述 | 示例 |
---|---|---|
* | 任意值 | 15 * * * 每天每小时的每个第 15 分钟运行。 |
, | 值列表分隔符 | 2,10 4,5 * * * 在每天第 4 和第 5 小时的第 2 和第 10 分钟运行。 |
- | 值的范围 | 30 4-6 * * * 在第 4、5 和 6 小时的第 30 分钟运行。 |
/ | 步骤值 | 20/15 * * * * 从第 20 分钟到第 59 分钟每隔 15 分钟运行(第 20、35 和 50 分钟)。 |
五、常用的actions
记录一些常用的官方或者第三方 acions
,
以下actions都是紧接在
uses: <action>
后面
官方Actions | Actions | 类型 |
---|---|---|
下载分支 | actions/checkout@v3 | 官方 |
缓存文件 | actions/cache@v2 | 官方 |
node环境 | actions/setup-node@v3 | 官方 |
上传文件 | actions/upload-artifact@v3 | 官方 |
发布1 | action gh-release | |
发布2 | Github-Release-Action | |
发布3 | action-automatic-releases |
第三方Action | Actions | |
---|---|---|
npm 发布 | JS-DevTools/npm-publish@v1 | |
github Release | softprops/action-gh-release@v1 |
环境配置
Actions | 说明 | 类型 |
---|---|---|
下载nodejs环境 | actions/setup-node@v3 |
cache - 缓存
官方文档也有说明 缓存文档
缓存大致原理就是把目标路径打包存储下来,并记录一个唯一key。
下次启动时,根据key去查找。找到了就再按路径解压开。
注意缓存有大小限制。对于免费用户,单个包不能超过500MB,整个仓库的缓存不能超过2G。
steps:
...
- use: actions/cache@v1
with:
...
...